#include "stm32f10x.h"                  // Device header

/**
  * 函    数：AD初始化
  * 参    数：无
  * 返 回 值：无
  */
uint32_t HX711_Buffer;
uint32_t Weight_Maopi;

int32_t Weight_Zhengshu;
int32_t Weight_xiaoshu;
float Weight_tmp;
#define W_SCK(X)  GPIO_WriteBit(GPIOB,GPIO_Pin_1,(BitAction)(X))
#define R_DT      GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)
//校准参数
#define GapValue 3355.4
void HX711_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能GPIOB的时钟
    GPIO_InitTypeDef hx711_gpio_struct;//创建一个GPIO结构体
   
    //SCK
    hx711_gpio_struct.GPIO_Mode=GPIO_Mode_Out_PP;//SCK为开漏输出模式
    hx711_gpio_struct.GPIO_Pin=GPIO_Pin_1;
    hx711_gpio_struct.GPIO_Speed=GPIO_Speed_50MHz;//通用50MHz
    GPIO_Init(GPIOB,&hx711_gpio_struct); //使能
    
    //DT
    hx711_gpio_struct.GPIO_Mode=GPIO_Mode_IPU;//DT为上拉输入模式，
	//如果IO口外部没有信号输入或者悬空，则IO口默认为高电平。
	//如果此时IO口有输入低电平，那么引脚就为低电平，MCU读取到的就是低电平
    hx711_gpio_struct.GPIO_Pin=GPIO_Pin_0;
    hx711_gpio_struct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&hx711_gpio_struct);
    
	GPIO_WriteBit(GPIOB,GPIO_Pin_1,Bit_SET);//这里是初始化定义拉高SCK
}


unsigned long HX711_Read(void)//unsigned long 为无符号整数，不能表示负数
{
    unsigned long Count;
    unsigned char i;//为无符号字符，不能表示负
    W_SCK(0);//拉低SCK时钟
    Count=0;//相当于清空Count里的所有数
    while(R_DT);//由于DT是上拉输入，所以当DT口没有信号输入或者悬空
	//则IO口默认为高电平，即R_DT==1，
	//直到DT口检测到了信号输入，才置为低电平，进入下面程序
    for (i=0;i<24;i++)//这里由于是128增益，所以要循环24次
    {
        W_SCK(1);
        Count=Count<<1;//这里指的是将Count左位移一位
        W_SCK(0);
        if(R_DT) //如果有DT电平输入，那空的Count那一位就由0变1
			//否则Coun那一位任然为0，等下一次Count位移继续判断
            Count++;
    }
    W_SCK(1);
    Count=Count^0x800000; //最高位取反，其他位不变
	                      //在HX71芯片中，count是一个32位的有符号整数，用于存储称重传感器的读数。
	                      //当count的最高位为1时，表示读数为负数，而HX711芯片不支持负数的读数。
	                      //因此，为了将负数转换为正数，需要将count的最高位取反，即将count与0x800000进行异或操作。
                          //具体来说，0x800000的二进制表示为100000000000000000000000，与count进行异或操作后，
	                      //可以将count的最高位从1变为0，从而得到对应的正数读数。
    W_SCK(0);
    return(Count);
}

//校准参数
#define GapValue 3355.4

void Get_Maopi(void)
{
    Weight_Maopi = HX711_Read();
}

void Get_Weight(void)
{
    HX711_Buffer = HX711_Read();
    if(HX711_Buffer > Weight_Maopi)
    {
        Weight_Zhengshu = HX711_Buffer;
        Weight_Zhengshu = Weight_Zhengshu - Weight_Maopi;     //获取实物的AD采样数值。
        Weight_Zhengshu = (int32_t)(((float)Weight_Zhengshu/GapValue)*10/1.082);     //weight(x)=x*5kg/2^24
        Weight_tmp = ((float)Weight_Zhengshu/GapValue)*10/1.082;//注意，这里GapValue与1.082都是校准值，根据自己的实际情况进行调整
        Weight_tmp -= Weight_Zhengshu;
        if(Weight_tmp<0)
        {
            Weight_tmp = -Weight_tmp;
        }
        Weight_xiaoshu = (int32_t)(Weight_tmp*10);
    }
}
